package org.example.ssh.base

class SshFile(
    var name: String,
    var path: String,
    var size: Long,
    var isDirectory: Boolean,
    var auth: String = "" // 这里存储 ls -l 输出的权限字符串，如 drwx------
) {
    // 可以添加 toString() 方法方便打印
    override fun toString(): String {
        return "SshFile(name='$name', path='$path', size=$size, isDirectory=$isDirectory, auth='$auth')"
    }
}

fun parseLsOutput(lsOutput: String, basePath: String = "/"): List<SshFile> {
    val files = mutableListOf<SshFile>()
    val lines = lsOutput.trim().split("\n")

    for (line in lines) {
        val trimmedLine = line.trim()

        // 跳过 total 行
        if (trimmedLine.startsWith("total")) continue

        // 按空格分割，过滤空字符串
        val parts = trimmedLine.split("\\s+".toRegex()).filter { it.isNotEmpty() }

        // 至少需要 8 个部分 (权限 链接数 用户 组 大小 月 日 时间/年 名称)
        if (parts.size < 8) {
            println("❌ Invalid line format: $trimmedLine")
            continue
        }

        try {
            val permissions = parts[0]
            val isDirectory = permissions.startsWith('d')
            val size = parts[4].toLongOrNull() ?: 0L

            // 日期时间部分：索引 5,6,7 是 月 日 时间/年
            // 名称是从索引 8 开始到末尾的所有部分（处理名称中带空格的情况）
            val nameStartIndex = 8
            if (nameStartIndex >= parts.size) {
                println("❌ No filename found: $trimmedLine")
                continue
            }
            val name = parts.subList(nameStartIndex, parts.size).joinToString(" ")

            val fullPath = if (basePath.endsWith("/")) {
                "${basePath}$name"
            } else {
                "$basePath/$name"
            }

            val sshFile = SshFile(
                name = name,
                path = fullPath,
                size = size,
                isDirectory = isDirectory,
                auth = permissions
            )
            files.add(sshFile)

        } catch (e: Exception) {
            println("❌ Error parsing line: $trimmedLine, Error: ${e.message}")
        }
    }

    return files
}
